<?php
/**
 * @brief Klasa mapująca dane z bazy danych na obiekty klasy encyjnej Application_Model_CalendarPeriod
 *
 * Obiekty tej klasy pośredniczą wymianie danych między bazą danych a obiektami klasy CalendarPeriod.
 * Za pomocą metod z przypisanej klasy tabeli tworzą obiekty na podstawie danych z bazy danych 
 * oraz zapisują informacje z obiektów do bazy danych.
 */
class Application_Model_CalendarPeriodMapper
{
    protected $_dbTable; /*!<  Klasa tabeli */

    /**
     * @brief Metoda do ustawiania nazwy powiązanej klasy tabel o podanej nazwie.
     * 
     * @param string $dbTable
     * @return Application_Model_CalendarPeriodMapper 
     */
    public function setDbTable($dbTable) {

        if (is_string($dbTable)) {

            $dbTable = new $dbTable();
        }

        if (!$dbTable instanceof Zend_Db_Table_Abstract) {

            throw new Exception('Invalid table data gateway provided');
        }

        $this->_dbTable = $dbTable;

        return $this;
    }
    /**
     * @brief Metoda zwracająca klasę tabel.
     * 
     * @return Application_Model_DbTable_CalendarPeriod
     */
    public function getDbTable() {

        if (null === $this->_dbTable) {

            $this->setDbTable('Application_Model_DbTable_CalendarPeriod');   
        }

        return $this->_dbTable;
    }

    /**
     *@brief Metoda zapisująca informacje do bazy danych  z obiektu reprezentującego termin dostawy.
     *
     * Metoda służy zarówno do tworzenia w bazie danych nowych rekordów, jak i aktualizacji starych. 
     * Aktualizacja następuje w przypadku, gdy obiekt posiada już indywidualny identyfikator.
     * 
     * @param Application_Model_CalendarPeriod $period 
     */
    public function save(Application_Model_CalendarPeriod $period) { 

        $data = array(

            'MarketEntity_id'   =>  $period->getMarketEntity_id(),
            'name'              =>  $period->getName(),
            'periodType'        =>  $period->getPeriodType(),
            'startTime'         =>  $period->getStartTime(),
            'endTime'           =>  $period->getEndTime(),
            
        );



        if (null === ($id = $period->getCalendarPeriod_id())) {

            unset($data['CalendarPeriod_id']);

            $this->getDbTable()->insert($data);
        } else {

            $this->getDbTable()->update($data, array('CalendarPeriod_id = ?' => $id));
            
        }
    }
    /**
     * @brief Metoda wyszukująca termin dostawy na podstawie identyfikatora.
     *
     * Metoda generuje pojedynczy obiekt reprezentujący termin dostawy na podstawie rekordu, o podanym
     * identyfikatorze, znalezionego w bazie danych.
     * 
     * @param int $id
     * @return Application_Model_CalendarPeriod | NULL
     */
    public function find($id) { 
        $period = new Application_Model_CalendarPeriod();   //tu wpisać
        $result = $this->getDbTable()->find($id);

        if (0 == count($result)) {

            return;
        }

        $row = $result->current();

        $period->setCalendarPeriod_id($row->CalendarPeriod_id);
        $period->setMarketEntity_id($row->MarketEntity_id);
        $period->setName($row->name);
        $period->setPeriodType($row->periodType);
        $period->setStartTime($row->startTime);
        $period->setEndTime($row->endTime);
        
        return $period;

    }
    
    /**
     * @brief Metoda wyszukująca zbiór terminów dostaw na podstawie danych wejściowych.
     *
     * Metoda wyszukuje zbiór terminów dostaw i zwraca tablicę obiektów Application_Model_CalendarPeriod. 
     * Zbiór rekordów uzyskanych z klasy tabel jest przetwarzany przez inną metodę.
     * 
     * @param string $query
     * @return array Application_Model_CalendarPeriod 
     */
    public function fetchAll($query = NULL) {
        if ($query === NULL) {
            $resultSet = $this->getDbTable()->fetchAll();
            
        } else {
            $table = $this->getDbTable();
            $select = $table->select();
            $select->from($table)
                    ->where($query);

            $resultSet = $this->getDbTable()->fetchAll($select);
        }
        return $this->processResultSet($resultSet);
    }

    /**
     * @brief Metoda przetwarza rekordy na obiekty.
     * 
     * @param Zend_Db_Table_Rowset $resultSet
     * @return array Application_Model_CalendarPeriod 
     */
    private function processResultSet($resultSet) {
        $entries = array();
        foreach ($resultSet as $row) {

            $period = new Application_Model_CalendarPeriod();

            $period->setCalendarPeriod_id($row->CalendarPeriod_id);
            $period->setMarketEntity_id($row->MarketEntity_id);
            $period->setName($row->name);
            $period->setPeriodType($row->periodType);
            $period->setStartTime($row->startTime);
            $period->setEndTime($row->endTime);

            $entries[] = $period;
        }
        return $entries;
    }
    /**
     * @brief Metoda usuwa z bazy danych rekord o podanych kryteriach.
     * 
     * Metoda sprawdza na podstawie danych wejściowych, czy żądanie usunięcia
     * terminu jest uprawnione.
     * 
     * @param int $period_id Identyfiaktor terminu.
     * @param string $user | NULL  Nazwa jednostki rynkowej.
     * @param bool $global Czy termin jest globalny?
     * @return TRUE jak udało się usunąć termin, False w przeciwnym wypadku. 
     */
    public function delete($period_id, $user = NULL, $global = FALSE){
        $period  = $this->find($period_id);
        $mapper = new Application_Model_CommodityMapper();
        $commodities = $mapper->fetchAll('CalendarPeriod_id = '.$period_id);
        if(isset($period) && empty($commodities)){
           if((($user != NULL) && $period->getMarketEntity_id() == $user) || ($global == TRUE && $period->getPeriodType() == 'global')){
                $this->getDbTable()->delete('CalendarPeriod_id = '.$period_id);
                return TRUE;
            }
        }
        
        return FALSE;
    }
    
    /**
     * @brief Metoda zlicza rekordy odpowiadających podanym kryteriom.
     * 
     * @param string $query
     * @return int 
     */
    public function count($query = NULL)
    {
        $table = $this->getDbTable();
        $select = $table->select();
        $select->from($table,array('count(*) as amount'));
        if($query != NULL)
        $select->where($query);
        $rows = $table->fetchAll($select);
        return($rows[0]->amount); 
    }
    
}

